package com.biblioteca.servicio;

import org.springframework.stereotype.Service;
import com.biblioteca.dao.*;
import com.biblioteca.persistencia.*;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service("VotoServicio")
public class VotoServicioImplementacion implements VotoServicio {

    private VotoDao votoDao;
    private LibroDao libroDao;
    private UsuarioDao usuarioDao;

    @Autowired
    @Required
    public void setLibroDao(LibroDao libroDao) {
        this.libroDao = libroDao;
    }

    @Required
    @Autowired
    public void setVotoDao(VotoDao votoDao) {
        this.votoDao = votoDao;
    }

    @Required
    @Autowired
    public void setUsuarioDao(UsuarioDao usuarioDao) {
        this.usuarioDao = usuarioDao;
    }

    @Override
    @Transactional
    public void crear(int rating1, Libro libro, Usuario usuario){
        List<Voto> votos = votoDao.getVotos(usuario.getUsername(), libro.getIsbn());
        Voto yaVotado = null;
        if (votos != null && !votos.isEmpty()) {
            yaVotado = votos.get(0);
        }

        if (yaVotado == null) {
        Voto voto = new Voto();
        voto.setVoto(rating1);
        voto.setLibro(libro.getIsbn());
        voto.setUsuario(usuario.getUsername());
        votoDao.insert(voto);
        libro.getVotos().add(voto.getId());
        libroDao.update(libro);
        usuario.getVotos().add(voto.getId());
        usuarioDao.update(usuario);
        }else {
            yaVotado.setVoto(rating1);
        }
    }

      @Override
    public List<Key> getVotos(String isbn) {
        Libro libro = libroDao.findByPK(Libro.class, isbn);
        return libro.getVotos();
    }

    @Override
    public Voto findVoto(Key id) {
        return votoDao.findByPK(Voto.class, id);
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void insertar(Voto voto) {
        votoDao.insert(voto);
    }

    @Override
    public void update(Voto voto) {
        votoDao.update(voto);
    }

    
    public List<Voto> buscarVotosLibros(String isbn) {
        System.out.println("Iniciando Busqueda en Servicio");
        List<Voto> lib = votoDao.getLibrosVotos(isbn);
        //no llega a devolver ningun elemento en la lista
        System.out.println("Finalizada");
        return lib;
    }

    @Override
    public List<Voto> BuscarVotosLibros(String isbn) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void eliminarVotos() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
